package com.yanxu.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

/**
 * @author 折戟沉沙铁未销
 * @version V1.0
 * @date 2025-05-29-2025
 * @Description: 这里用一句话描述这个类的作用
 */
public class ChatHandler implements Runnable {

    private Socket socket;
    private ChatServer chatServer;

    public ChatHandler(Socket socket, ChatServer chatServer) {
        this.socket = socket;
        this.chatServer = chatServer;
    }

    @Override
    public void run() {
        try {
            // 客户端名称
            String clientName = socket.getInetAddress().getHostName() + ":" + socket.getPort();

            // 添加到 客户端集合列表中
            chatServer.addClient(socket);

            // 获取 reader 对象。 读取 客户端 发送的消息
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String msg = null;
            // 不断的读取客户端发送的内容，因此，是在一个 循环 中读取的。
            // readLine() 本身也是阻塞函数，如果客户端没有发送过来数据，就会在这等待，直到有数据过来。
            while ((msg = reader.readLine()) != null) {
                System.out.println("服务端收到消息：" + clientName + "的消息: " + msg);

                // 消息转发到群聊中的其他客户端
                chatServer.forwardMessage(socket, clientName + ": " + msg + "\n");

                // 客户端退出
                if ("bye".equals(msg)) {
                    break;
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 从客户端集合中移除 该客户端
                chatServer.removeClient(socket);
                // 释放资源
                chatServer.close(socket);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}